iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0

上篇的最後提到物件導向程式設計有三大「鼎足」,不過西方人好像沒有鼎,所以通常用「支柱」(pillars)來形容。其實不管鼎足還是支柱,指的都是OO的幾大重要概念。筆者個人本來比較喜歡「鼎足」,但為了「國際接軌」,以下都用「支柱」一詞。

OO究竟有幾大支柱?

  • 印象中,早期多半都說OO有三大支柱,分別是:
    • Encapsulation(封裝)
    • Inheritance(繼承)
    • Polymorphism(多型)
  • 近期文獻則比較傾向四大支柱,多出的那條為Abstraction(萃取/摘要)
  • 本系列文章原則上採用三大支柱論,Abstraction或棄而不談,或融入其他支柱中,視乎筆者肚中墨水多少。
  • 不管三大還是四大支柱,很多人說,OO的最終目的其實是Polymorphism(多型)。前面的萃取、封裝和繼承,可以說都是為了實踐「多型」作準備。
  • 先談封裝。從理論到實務(Python如何實作封裝),封裝可以說的非常之多,水絕對不淺。筆者打算用n篇來詳談,所以各位看官如有耐性讀下去,往後好多篇可能會給我封裝這封裝那的,搞得一頭霧水。
  • 今天先說理論部分:
    • 封裝(Encapsulation)的目的,是將程式碼切割成許多部件(亦可稱為模組),使各部件之間的關連或耦合(Dependency, Coupling)降到最低,目的是盡量避免系統「牽一髮而動全身」。如果能做到這點,部件(模組)間相互依賴的程度就會減少,整個系統沒那麼複雜和「糾結」,對開發和日後維護都大有好處。
    • 上面所講的部件或模組,在物件導向的程式語言上,多半稱為「類別」classes。
    • 我們可以將「類別」視為封裝的結果,讓「部件」或「模組」專注作為整個程式切割出來的更大區塊(功能)。
    • 在OO的世界,一個系統大概都會有多個部件或模組,一個模組內則可能包含多個類別。
    • 封裝是以資料為核心,將相關的資料(變數)集中,再把用得到這些資料的函數也包進來,等於將資料和其相關函數綁在一起。
    • 如上篇所述,為了和非OO的世界有所區隔(其實是「蛋頭學者」愛創新詞),OO界修改了一些用語,將原本好好的函數(function)改稱為方法(method)、將call(呼叫)函數改稱為invoke(調用)方法。不過新舊詞彙基本上還是可以混用。筆者就經常不講武德,不,是不講「方法」,沿用「函數」。倒非無法接受新事物新名稱,而是認為「方法」一詞太過「普通」,常和一般情境下的方法混淆。「術語」還是稍和一般用詞有所區隔較好。
    • 再來是變數(variable),class內的變數現在改稱為屬性(attribute)了。注意:是attribute而非property。中文通常將兩者都譯作屬性,但此「屬性」非彼「屬性」,不要搞混。

理論方面先這樣點到即止。以後篇章隨機補充。

順便一提Python的兩點實務:

  • Python的錯誤訊息是method和attribute不分,通通稱作attribute。這是Python比較「特別」之處。筆者猜想,可能是「仁慈獨裁者」覺得以Python的特性,沒有必要在class內嚴格區分attribute和method吧。
  • 除了class,Python還有package和module(不過這兩者和OO無關)。package其實就是資料夾(老人家會講「目錄」),module則是.py檔。類別class就是放在module(.py檔)內。

今天到此收筆,明天開始要寫code了。


上一篇
類別是「模板」或「藍圖」
下一篇
Constructor是啥?
系列文
Oops! OOPP: An Introduction to Object-Oriented Programming in Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言